package main

import (
	"chatOnline/common/message"
	process2 "chatOnline/server/process"
	"chatOnline/server/utils"
	"fmt"
	"io"
	"net"
)

/*
根据客户端请求 调用相应处理器 总的控制器
*/

type Processor struct {
	Conn net.Conn
}

// 处理和客户端的通讯
// 编写一个ServerProcessMes 函数
// 功能  根据客户端发送的消息种类不同 ，决定调用那个函数来实现
func (this *Processor) serverPorcessMes(mes *message.Message) (err error) {

	// 看看是否可以接收到客户端发送的群发消息
	fmt.Println("mes=", mes)

	switch mes.Type {
	case message.LoginMesType:
		// 处理登录逻辑
		// 创建一个userProcess
		up := &process2.UserProcess{
			Conn: this.Conn,
		}
		err = up.ServerProcessLogin(mes)
	case message.RegisterMesType:
		// 处理注册
		up := &process2.UserProcess{
			Conn: this.Conn,
		}
		err = up.ServerProcessRegister(mes)
	case message.SmsMesType:
		smsProcess := &process2.SmsProcess{}
		smsProcess.SendGroupMes(mes)
	case message.SmsMesSingeType:
		smsProcess := &process2.SmsProcess{}
		smsProcess.SendSingleMes(mes)
	case message.FileLoadType:
		dealAction := &process2.ActionProcess{}
		dealAction.DealFileLoad(mes)
	default:
		fmt.Println("消息类型不存在 ， 无法处理")
	}

	return
}

func (this *Processor) process2() (err error) {
	for {
		// 这里我们将读取数据包，直接封装成一个函数readPkg(),返回Message,Err
		// 创建一个Transfer 实例完成读包任务
		tf := &utils.Transfer{
			Conn: this.Conn,
		}
		mes, err, n := tf.ReadPkg()
		if n == 0 {
			for _, v := range process2.UserMgrs.GetAllOnlineUser() {
				if this.Conn.RemoteAddr() == v.Conn.RemoteAddr() {
					process2.UserMgrs.DelOnlineUser(v.UserId)
					fmt.Printf("userId %d exit...\n", v.UserId)
				}
			}
		}
		if err != nil {
			if err == io.EOF {
				fmt.Println("对方关闭了连接 服务器端也正常退出")
				return err
			} else {
				fmt.Println("readPkg err=", err)
				return err
			}

		}
		err = this.serverPorcessMes(&mes)
		if err != nil {
			fmt.Println("serverProcessMes err=", err)
			return err
		}
		//fmt.Println("mes=",mes)

	}
}
